For procedural notes, see https://docs.google.com/document/d/19D9PL1GHnvecNTUE8VE_fwaeTmXNUuWdSwo6NsOBqlo/edit
The script below (also saved separately as sema_fitting_script.R) loads the proteome discoverer file, wrangles the data into a fotmat for input to the TPP package, and performs the curve fitting. Individual output plots can be viewed in the exported_plots folder. This code chunk does not have to be run again.
## Alice Herneisen
## Last updated: 26 February 2023
## Perform thermal profiling analysis, generate melting curves, save output files
# packages
library(tidyverse)
library(TPP)
library(plotly)
## set directories: input files (kept in inputdata folder)
setwd("~/Dropbox (MIT)/LOURIDO/COLLABORATIONS/Aarti_Krishnan/inputfiles")
file1 = "Sema_TPP_analysis_1_master_proteins_only_Proteins.txt"
## Load the protein data from Proteome Discoverer - "raw" data frames
DF1 <- read.table(file1,
header = T,
fill = T,
stringsAsFactors = F)
## Keep most relevant columns of Proteome Discoverer data frame and add columns of 1's
## corresponding to the lowest temperature
## columns to keep from Proteome Discoverer
DMSO_1 <- DF1 %>% dplyr::select(Description, Accession, Number.of.PSMs, Number.of.Unique.Peptides,
"Abundance.Ratio.44.DMSO..40.DMSO",
"Abundance.Ratio.47.DMSO..40.DMSO",
"Abundance.Ratio.51.DMSO..40.DMSO",
"Abundance.Ratio.55.DMSO..40.DMSO",
"Abundance.Ratio.58.DMSO..40.DMSO",
"Abundance.Ratio.60.DMSO..40.DMSO",
"Abundance.Ratio.63.DMSO..40.DMSO",
"Abundance.Ratio.66.DMSO..40.DMSO",
"Abundance.Ratio.70.DMSO..40.DMSO") %>%
rename(gene_name = Accession) %>%
rename(gene_description = Description) %>%
add_column(Abundance_Ratio_1 = as.numeric(1), .before = 5)
SEMA_1 <- DF1 %>% dplyr::select(Description, Accession, Number.of.PSMs, Number.of.Unique.Peptides,
"Abundance.Ratio.44.sema..40.sema",
"Abundance.Ratio.47.sema..40.sema",
"Abundance.Ratio.51.sema..40.sema",
"Abundance.Ratio.55.sema..40.sema",
"Abundance.Ratio.58.sema..40.sema",
"Abundance.Ratio.60.sema..40.sema",
"Abundance.Ratio.63.sema..40.sema",
"Abundance.Ratio.66.sema..40.sema",
"Abundance.Ratio.70.sema..40.sema") %>%
rename(gene_name = Accession) %>%
rename(gene_description = Description) %>%
add_column(Abundance_Ratio_1 = as.numeric(1), .before = 5)
## Create list of TMT labels for renaming the columns (see below)
TMTrange <- c("126", "127N", "127C", "128N", "128C", "129N", "129C", "130N", "130C","131")
## create data frames corresponding to input relative frequencies of the vehicle and treatment
## temperature range lysate experiments. These data frames are input to the TPP package.
names(SEMA_1)[5:14] <- paste("rel_fc_", TMTrange, sep="")
names(DMSO_1)[5:14] <- paste("rel_fc_", TMTrange, sep="")
#################### CURVE FITTING ####################
exptconfig <- read.csv("Ecoli_SEMA_config_table.csv",
header = T,
stringsAsFactors = F,
check.names=F)
dflist <- list(DMSO_1,
SEMA_1)
names(dflist) <- c("DMSO_1", "SEMA_1")
resultPath <- "~/Dropbox (MIT)/LOURIDO/COLLABORATIONS/Aarti_Krishnan/exported_plots"
fits <- analyzeTPPTR(configTable = exptconfig,
data = dflist,
resultPath = resultPath,
normalize = TRUE,
nCores = 1,
verbose = TRUE,
xlsxExport = FALSE)
## save the output data frames
write.table(fits, file = "DMSO_SEMA_tr_fits_R1.txt",
quote = FALSE,
sep = "\t",
row.names = FALSE)
Plots
The TPP package fits curves using a sigmoidal and nonparametric analysis. I like to view the sigmoidal melting curves as an xy scatter, highlighting points that have a large differential in Tm under one condition.
I’ve used plotly to create an interactive plot.
p <- ggplot(data = fits, aes(x = meltPoint_DMSO_1,
y = meltPoint_SEMA_1,
color = -log10(pVal_adj_SEMA_1_vs_DMSO_1),
text = paste0(Protein_ID, "\n",
gene_description_DMSO_1))) +
geom_point() +
theme(aspect.ratio = 1)
p

ggplotly(p, tooltip = c("text"))
Aspect ratios aren't yet implemented, but you can manually set a suitable height/widthAspect ratios aren't yet implemented, but you can manually set a suitable height/width
NA
The NPARC can be summarized as a rank-ordered plot.
p <- ggplot(data = fits, aes(x = rank(p_adj_NPARC, ties.method = "first"),
y = -log10(p_adj_NPARC),
text = paste0(Protein_ID, "\n",
gene_description_DMSO_1))) +
geom_point(color = "snow3") +
geom_hline(yintercept = -log10(0.01)) +
theme(aspect.ratio = 1)
p

ggplotly(p, tooltip = c("text"))
Aspect ratios aren't yet implemented, but you can manually set a suitable height/widthAspect ratios aren't yet implemented, but you can manually set a suitable height/width
LS0tCnRpdGxlOiAic2VtYSB0ZW1wZXJhdHVyZSByYW5nZSBDRVRTQSByZXBsaWNhdGUgMSAtLSBhbmFseXNpcyBub3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKRm9yIHByb2NlZHVyYWwgbm90ZXMsIHNlZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzE5RDlQTDFHSG52ZWNOVFVFOFZFX2Z3YWVUbVhOVXVXZFN3bzZOc09CcWxvL2VkaXQKCgpUaGUgc2NyaXB0IGJlbG93IChhbHNvIHNhdmVkIHNlcGFyYXRlbHkgYXMgc2VtYV9maXR0aW5nX3NjcmlwdC5SKSBsb2FkcyB0aGUgcHJvdGVvbWUgZGlzY292ZXJlciBmaWxlLCB3cmFuZ2xlcyB0aGUgZGF0YSBpbnRvIGEgZm90bWF0IGZvciBpbnB1dCB0byB0aGUgVFBQIHBhY2thZ2UsIGFuZCBwZXJmb3JtcyB0aGUgY3VydmUgZml0dGluZy4gSW5kaXZpZHVhbCBvdXRwdXQgcGxvdHMgY2FuIGJlIHZpZXdlZCBpbiB0aGUgZXhwb3J0ZWRfcGxvdHMgZm9sZGVyLiBUaGlzIGNvZGUgY2h1bmsgZG9lcyBub3QgaGF2ZSB0byBiZSBydW4gYWdhaW4uCmBgYHtyfQojIyBBbGljZSBIZXJuZWlzZW4KIyMgTGFzdCB1cGRhdGVkOiAyNiBGZWJydWFyeSAyMDIzCiMjIFBlcmZvcm0gdGhlcm1hbCBwcm9maWxpbmcgYW5hbHlzaXMsIGdlbmVyYXRlIG1lbHRpbmcgY3VydmVzLCBzYXZlIG91dHB1dCBmaWxlcwoKIyBwYWNrYWdlcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShUUFApCmxpYnJhcnkocGxvdGx5KQoKIyMgc2V0IGRpcmVjdG9yaWVzOiBpbnB1dCBmaWxlcyAoa2VwdCBpbiBpbnB1dGRhdGEgZm9sZGVyKQpzZXR3ZCgifi9Ecm9wYm94IChNSVQpL0xPVVJJRE8vQ09MTEFCT1JBVElPTlMvQWFydGlfS3Jpc2huYW4vaW5wdXRmaWxlcyIpCmZpbGUxID0gIlNlbWFfVFBQX2FuYWx5c2lzXzFfbWFzdGVyX3Byb3RlaW5zX29ubHlfUHJvdGVpbnMudHh0IgoKIyMgTG9hZCB0aGUgcHJvdGVpbiBkYXRhIGZyb20gUHJvdGVvbWUgRGlzY292ZXJlciAtICJyYXciIGRhdGEgZnJhbWVzCkRGMSA8LSByZWFkLnRhYmxlKGZpbGUxLCAKICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVCwgCiAgICAgICAgICAgICAgICAgIGZpbGwgPSBULCAKICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCgojIyBLZWVwIG1vc3QgcmVsZXZhbnQgY29sdW1ucyBvZiBQcm90ZW9tZSBEaXNjb3ZlcmVyIGRhdGEgZnJhbWUgYW5kIGFkZCBjb2x1bW5zIG9mIDEncwojIyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb3dlc3QgdGVtcGVyYXR1cmUKIyMgY29sdW1ucyB0byBrZWVwIGZyb20gUHJvdGVvbWUgRGlzY292ZXJlciAKRE1TT18xIDwtIERGMSAlPiUgZHBseXI6OnNlbGVjdChEZXNjcmlwdGlvbiwgQWNjZXNzaW9uLCBOdW1iZXIub2YuUFNNcywgTnVtYmVyLm9mLlVuaXF1ZS5QZXB0aWRlcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby40NC5ETVNPLi40MC5ETVNPIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby40Ny5ETVNPLi40MC5ETVNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjUxLkRNU08uLjQwLkRNU08iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNTUuRE1TTy4uNDAuRE1TTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby41OC5ETVNPLi40MC5ETVNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjYwLkRNU08uLjQwLkRNU08iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNjMuRE1TTy4uNDAuRE1TTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby42Ni5ETVNPLi40MC5ETVNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjcwLkRNU08uLjQwLkRNU08iKSAlPiUgCiAgcmVuYW1lKGdlbmVfbmFtZSA9IEFjY2Vzc2lvbikgJT4lCiAgcmVuYW1lKGdlbmVfZGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbikgJT4lIAogIGFkZF9jb2x1bW4oQWJ1bmRhbmNlX1JhdGlvXzEgPSBhcy5udW1lcmljKDEpLCAuYmVmb3JlID0gNSkKClNFTUFfMSA8LSBERjEgJT4lIGRwbHlyOjpzZWxlY3QoRGVzY3JpcHRpb24sIEFjY2Vzc2lvbiwgTnVtYmVyLm9mLlBTTXMsIE51bWJlci5vZi5VbmlxdWUuUGVwdGlkZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNDQuc2VtYS4uNDAuc2VtYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNDcuc2VtYS4uNDAuc2VtYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby41MS5zZW1hLi40MC5zZW1hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjU1LnNlbWEuLjQwLnNlbWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNTguc2VtYS4uNDAuc2VtYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby42MC5zZW1hLi40MC5zZW1hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjYzLnNlbWEuLjQwLnNlbWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNjYuc2VtYS4uNDAuc2VtYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby43MC5zZW1hLi40MC5zZW1hIikgJT4lIAogIHJlbmFtZShnZW5lX25hbWUgPSBBY2Nlc3Npb24pICU+JQogIHJlbmFtZShnZW5lX2Rlc2NyaXB0aW9uID0gRGVzY3JpcHRpb24pICU+JSAKICBhZGRfY29sdW1uKEFidW5kYW5jZV9SYXRpb18xID0gYXMubnVtZXJpYygxKSwgLmJlZm9yZSA9IDUpCgoKIyMgQ3JlYXRlIGxpc3Qgb2YgVE1UIGxhYmVscyBmb3IgcmVuYW1pbmcgdGhlIGNvbHVtbnMgKHNlZSBiZWxvdykKClRNVHJhbmdlIDwtIGMoIjEyNiIsICIxMjdOIiwgIjEyN0MiLCAiMTI4TiIsICIxMjhDIiwgIjEyOU4iLCAiMTI5QyIsICIxMzBOIiwgIjEzMEMiLCIxMzEiKQoKIyMgY3JlYXRlIGRhdGEgZnJhbWVzIGNvcnJlc3BvbmRpbmcgdG8gaW5wdXQgcmVsYXRpdmUgZnJlcXVlbmNpZXMgb2YgdGhlIHZlaGljbGUgYW5kIHRyZWF0bWVudAojIyB0ZW1wZXJhdHVyZSByYW5nZSBseXNhdGUgZXhwZXJpbWVudHMuIFRoZXNlIGRhdGEgZnJhbWVzIGFyZSBpbnB1dCB0byB0aGUgVFBQIHBhY2thZ2UuCgoKbmFtZXMoU0VNQV8xKVs1OjE0XSA8LSBwYXN0ZSgicmVsX2ZjXyIsIFRNVHJhbmdlLCBzZXA9IiIpCm5hbWVzKERNU09fMSlbNToxNF0gPC0gcGFzdGUoInJlbF9mY18iLCBUTVRyYW5nZSwgc2VwPSIiKQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjICBDVVJWRSBGSVRUSU5HICMjIyMjIyMjIyMjIyMjIyMjIyMjCgpleHB0Y29uZmlnIDwtIHJlYWQuY3N2KCJFY29saV9TRU1BX2NvbmZpZ190YWJsZS5jc3YiLCAKICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBULCAKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgY2hlY2submFtZXM9RikKZGZsaXN0IDwtIGxpc3QoRE1TT18xLCAKICAgICAgICAgICAgICAgU0VNQV8xKQpuYW1lcyhkZmxpc3QpIDwtIGMoIkRNU09fMSIsICJTRU1BXzEiKQoKcmVzdWx0UGF0aCA8LSAifi9Ecm9wYm94IChNSVQpL0xPVVJJRE8vQ09MTEFCT1JBVElPTlMvQWFydGlfS3Jpc2huYW4vZXhwb3J0ZWRfcGxvdHMiCmZpdHMgPC0gYW5hbHl6ZVRQUFRSKGNvbmZpZ1RhYmxlID0gZXhwdGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmbGlzdCwgCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFBhdGggPSByZXN1bHRQYXRoLCAKICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIG5Db3JlcyA9IDEsIAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIHhsc3hFeHBvcnQgPSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiMjIHNhdmUgdGhlIG91dHB1dCBkYXRhIGZyYW1lcwp3cml0ZS50YWJsZShmaXRzLCBmaWxlID0gIkRNU09fU0VNQV90cl9maXRzX1IxLnR4dCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICJcdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKIyMgUGxvdHMKClRoZSBUUFAgcGFja2FnZSBmaXRzIGN1cnZlcyB1c2luZyBhIHNpZ21vaWRhbCBhbmQgbm9ucGFyYW1ldHJpYyBhbmFseXNpcy4gSSBsaWtlIHRvIHZpZXcgdGhlIHNpZ21vaWRhbCBtZWx0aW5nIGN1cnZlcyBhcyBhbiB4eSBzY2F0dGVyLCBoaWdobGlnaHRpbmcgcG9pbnRzIHRoYXQgaGF2ZSBhIGxhcmdlIGRpZmZlcmVudGlhbCBpbiBUbSB1bmRlciBvbmUgY29uZGl0aW9uLiAKCkkndmUgdXNlZCBwbG90bHkgdG8gY3JlYXRlIGFuIGludGVyYWN0aXZlIHBsb3QuCmBgYHtyfQpwIDwtIGdncGxvdChkYXRhID0gZml0cywgYWVzKHggPSBtZWx0UG9pbnRfRE1TT18xLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbWVsdFBvaW50X1NFTUFfMSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gLWxvZzEwKHBWYWxfYWRqX1NFTUFfMV92c19ETVNPXzEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoUHJvdGVpbl9JRCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfZGVzY3JpcHRpb25fRE1TT18xKSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShhc3BlY3QucmF0aW8gPSAxKQpwCmdncGxvdGx5KHAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYAoKVGhlIE5QQVJDIGNhbiBiZSBzdW1tYXJpemVkIGFzIGEgcmFuay1vcmRlcmVkIHBsb3QuCmBgYHtyfQogICAgCnAgPC0gZ2dwbG90KGRhdGEgPSBmaXRzLCBhZXMoeCA9IHJhbmsocF9hZGpfTlBBUkMsIHRpZXMubWV0aG9kID0gImZpcnN0IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAtbG9nMTAocF9hZGpfTlBBUkMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoUHJvdGVpbl9JRCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfZGVzY3JpcHRpb25fRE1TT18xKSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gInNub3czIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1sb2cxMCgwLjAxKSkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpCnAKZ2dwbG90bHkocCwgdG9vbHRpcCA9IGMoInRleHQiKSkgICAgICAgICAgICAgICAgICAgICAgCgpgYGAKCg==